import http from 'wechat-http'
// const app = getApp() 错误代码 - 此时应用实例没创建好
// 接口基础地址
http.baseURL = 'https://live-api.itheima.net'
// 请求拦截器
http.intercept.request = (options) => {
  const app = getApp()
  // 指定默认的头信息
  const defaultHeader = {}
  // 权限验证 - 判断token存在,再往对象中添加
  if (app.token) defaultHeader.Authorization = app.token
  // 合并头信息
  // 将源对象1...合并到目标对象并且返回目标对象
  // options.header = Object.assign(目标对象, 源对象1, 源对象2)
  options.header = Object.assign({}, defaultHeader, options.header)
  // console.log(options)
  return options
}

// 响应拦截器
http.intercept.response = async ({ statusCode, data, config }) => {
  // console.log(statusCode) // http 响应状态码
  const app = getApp()
  console.log(config) // 发起请求时的参数
  if (statusCode === 401) {
    // 判断refreshToken如果不存在, 直接终止程序执行
    if (!app.refreshToken) return
    // -------------------------
    // 如果token和refreshToken都失效了, 此时重定向到登录页
    // 判断请求的路径是否包含/refreshToken
    // includes  指的是判断是否存在某个字符串
    if (config.url.includes('/refreshToken')) {
      // 此时refreshToken已经失效了
      // 重定向到登录页 - 记录从哪来
      const pageStack = getCurrentPages()
      const currentPage = pageStack[pageStack.length - 1].route
      // redirectUrl=/house_pkg/pages/list/index
      return wx.redirectTo({
        url: `/pages/login/index?redirectUrl=/${currentPage}`,
      })
    }
    // -------------------------
    // 之前 重定向到登录页 - 体验不好
    // 现在 重新去请求一个新的接口 (携带refreshToken) - 目的: 为了获取新的token
    const res = await http({
      method: 'POST',
      url: '/refreshToken',
      header: {
        Authorization: app.refreshToken, // 注意点: 传递的是app.refreshToken 不是app.token
      },
    })
    // 获取完最新的token和refreshToken, 进行存储
    console.log('-----刷新token返回的结果', res)
    if (res.data && res.data.token) {
      app.setToken(res.data.token, res.data.refreshToken)
      // 通过最新的token,再次获取接口数据
      return http(
        Object.assign(config, {
          header: {
            Authorization: app.token,
          },
        })
      )
    }
  }
  // 拦截器处理后的响应结果
  return data
}

// 挂载到 wx 全局命名空间
wx.http = http

// 也可作为模块导出
export default http
